﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.IO;

namespace HHMMS.FileServer
{
    /// <summary>
    /// 实现一个HTTP处理程序，用于在文件服务器上接收上传的文件并保存在文件服务器
    /// 需在文件服务器上的web.config中增加相应的配置。
    /// </summary>
    public class ReceiveHandler : IHttpHandler
    {
        #region IHttpHandler Members

        public bool IsReusable
        {
            get { return true; }
        }

        public void ProcessRequest(HttpContext context)
        {
            //获取URL参数action:upload表示上传, delete表示删除
            string action = context.Request.QueryString["action"];

            //URL中的文件名：/2012/07/08/6C48A454-294E-4FB3-A06C-EF583CD7D0FB.xls
            string fileName = context.Request.QueryString["fileName"];

            //确定请求是否合法
            if (string.IsNullOrEmpty(action) || string.IsNullOrEmpty(fileName))
            {
                context.Response.Clear();
                context.Response.Write("不合法的请求！");
                context.Response.End();
                return;
            }

            try
            {
                //文件在文件服务器上的保存路径
                string realPath = context.Server.MapPath(context.Request.Path);
                string savePath = Path.GetDirectoryName(realPath).TrimEnd('\\')
                    + "\\" + fileName.Replace("/", "\\").TrimStart('\\');

                //根据action参数处理请求
                switch (action)
                {
                    //处理文件上传请求
                    case "upload":
                        {
                            //判断是否有文件上传
                            if (context.Request.TotalBytes <= 0)
                            {
                                context.Response.Clear();
                                context.Response.Write("文件服务器没有接收到任何文件！");
                                context.Response.End();
                                return;
                            }

                            //文件所在目录
                            string dirName = savePath.Replace(Path.GetFileName(savePath), string.Empty);

                            //确保目录存在
                            if (!Directory.Exists(dirName))
                            {
                                Directory.CreateDirectory(dirName);
                            }

                            //将发送过来的数据保存为文件
                            using (FileStream file = new FileStream(savePath, FileMode.Append, FileAccess.Write))
                            {
                                using (BinaryReader dr = new BinaryReader(context.Request.InputStream))
                                {
                                    int blockSize = 1024 * 64, count = 0;
                                    byte[] buffer = new byte[blockSize];
                                    while ((count = dr.Read(buffer, 0, blockSize)) > 0)
                                    {
                                        file.Write(buffer, 0, count);
                                    }
                                }
                            }
                        }
                        break;

                    //处理文件删除请求
                    case "delete":
                        {
                            if (File.Exists(savePath))
                            {
                                File.Delete(savePath);
                            }
                        }
                        break;
                    default: break;
                }
            }
            catch (Exception ex)
            {
                context.Response.Clear();
                context.Response.Write(ex.InnerException);
                context.Response.End();
            }
        }
        #endregion
    }
}
